#include "tool/Utility.h"
#include "lib_json/json.h"
#include <fstream>
#include <iostream>
#include <algorithm>
#include <stdexcept>


bool Utility::LoadJson(std::string file, Json::Value& root) {
	try
	{
		//���������
		std::ifstream in;
		in.open(file, std::ios::in);
		if (!in.is_open()) {
			std::cout << "Check File" << file << " exist" << std::endl;
			return false;
		}
		Json::Reader reader;
		bool ret = reader.parse(in, root);
		if (!ret) {
			std::cout << file << " Parse Failed" << std::endl;
			return false;
		}
		return true;
	}
	catch (std::exception&) {
		return false;
	}
}

std::string Utility::GetFileName(const std::string& path) {
	size_t index = path.find_last_of("\\");

	//std::string folderPath = path.substr(0, index);
	std::string filename = path.substr(index + 1, -1);
	size_t index2 = filename.find_last_of(".");
	return filename.substr(0, index2);
	//size_t index2 = path.find_last_of(".");
	//std::string extendName = path.substr(index2 + 1, -1);
}


static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
static inline bool is_base64(const char c)
{
    return (isalnum(c) || (c == '+') || (c == '/'));
}
//加密
std::string Utility::base64_encode(const char * Data, unsigned int DataByte)
{
    //编码表
    const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    //返回值
    std::string strEncode;
    unsigned char Tmp[4]={0};
    int LineLength=0;
    for(int i=0;i<(int)(DataByte / 3);i++)
    {
        Tmp[1] = *Data++;
        Tmp[2] = *Data++;
        Tmp[3] = *Data++;
        strEncode+= EncodeTable[Tmp[1] >> 2];
        strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
        strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
        strEncode+= EncodeTable[Tmp[3] & 0x3F];
        if(LineLength+=4,LineLength==76) {strEncode+="\r\n";LineLength=0;}
    }
    //对剩余数据进行编码
    int Mod=DataByte % 3;
    if(Mod==1)
    {
        Tmp[1] = *Data++;
        strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
        strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];
        strEncode+= "==";
    }
    else if(Mod==2)
    {
        Tmp[1] = *Data++;
        Tmp[2] = *Data++;
        strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
        strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
        strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];
        strEncode+= "=";
    }
    
    return strEncode;
}
//解密
std::string Utility::base64_decode(const char* Data,int DataByte,int& OutByte)
{
    // //解码表
    // const char DecodeTable[] =
    // {
    //     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    //     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    //     62, // '+'
    //     0, 0, 0,
    //     63, // '/'
    //     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
    //     0, 0, 0, 0, 0, 0, 0,
    //     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
    //     13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
    //     0, 0, 0, 0, 0, 0,
    //     26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
    //     39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
    // };
    // //返回值
    // std::string strDecode;
    // int nValue;
    // int i= 0;
    // while (i < DataByte)
    // {
    //     if (*Data != '\r' && *Data!='\n')
    //     {
    //         nValue = DecodeTable[*Data++] << 18;
    //         nValue += DecodeTable[*Data++] << 12;
    //         strDecode+=(nValue & 0x00FF0000) >> 16;
    //         OutByte++;
    //         if (*Data != '=')
    //         {
    //             nValue += DecodeTable[*Data++] << 6;
    //             strDecode+=(nValue & 0x0000FF00) >> 8;
    //             OutByte++;
    //             if (*Data != '=')
    //             {
    //                 nValue += DecodeTable[*Data++];
    //                 strDecode+=nValue & 0x000000FF;
    //                 OutByte++;
    //             }
    //         }
    //         i += 4;
    //     }
    //     else// 回车换行,跳过
    //     {
    //         Data++;
    //         i++;
    //     }
    //  }
    // return strDecode;
	return "";
}